/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.gob.pnp.despachadores;

import java.sql.*;
import java.util.*;
import oracle.jdbc.*;
import pe.gob.pnp.actions.*;
import pe.gob.pnp.factories.*;

/**
 *
 * @author Gregorovichz Carlos Rossi
 * @date   01/04/2010
 */
public class RecursoDespachador {

    public static List<Recurso> obtenerRecursos() throws SQLException {
        List<Recurso> recursos = new ArrayList<Recurso>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_RECURSOS(?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.registerOutParameter(1, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(1);
            while (rs.next()) {
                Recurso recurso = new Recurso();
                recurso.setNrecuIdentificador(rs.getInt("NRECU_IDENTIFICADOR"));
                recurso.setCrecuNombre(rs.getString("CRECU_NOMBRE"));
                recurso.setCrecuUrl(rs.getString("CRECU_URL"));
                recurso.setNmoduIdentificador(rs.getInt("NMODU_IDENTIFICADOR"));
                recurso.setCmoduDescripcion(rs.getString("CMODU_DESCRIPCION"));
                recursos.add(recurso);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return recursos;
    }

    public static List<Recurso> obtenerRecurosPorModuloUsuario(Modulo modulo, Usuario usuario) throws SQLException {
        List<Recurso> lstRecursos = new ArrayList<Recurso>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_REC_MODULO_USUARIO(?,?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, modulo.getNmoduIdentificador());
            cs.setInt(2, usuario.getNusuaIdentificador());
            cs.registerOutParameter(3, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(3);
            while (rs.next()) {
                Recurso recurso = new Recurso();
                recurso.setNrecuIdentificador(rs.getInt("NRECU_IDENTIFICADOR"));
                recurso.setCrecuNombre(rs.getString("CRECU_NOMBRE"));
                recurso.setCrecuUrl(rs.getString("CRECU_URL"));
                lstRecursos.add(recurso);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstRecursos;
    }

    public static boolean asignarRecurso(Recurso recurso) throws SQLException {
        Connection conn = null;
        boolean asignado = false;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{ ? = call SEGURIDAD.F_ASIGNAR_RECURSO (?,?,?,?,?,?,?,?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setString(2, recurso.getCrecuNombre());
            cs.setInt(3, recurso.isBrecuActivo() ? 1 : 0);
            cs.setString(4, recurso.getCrecuUrl());
            cs.setInt(5, recurso.getNmoduIdentificador());
            cs.setInt(6, 0);
            cs.setInt(7, recurso.getNperfIdentificador());
            cs.setInt(8, recurso.getNrecuIdentificador());
            cs.setInt(9, recurso.isBpereActivo() ? 1 : 0);
            java.sql.Date sqlDate = new java.sql.Date(new java.util.Date().getTime());
            cs.setDate(10, sqlDate);
            cs.registerOutParameter(1, Types.INTEGER);
            cs.execute();
            int nro = cs.getInt(1);
            asignado = nro == 1;
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return asignado;
    }

    public static List<RecursoAsignado> obtenerRecursosAsignados(int nperfIdentificador) throws SQLException {
        List<RecursoAsignado> lstRecursos = new ArrayList<RecursoAsignado>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_RECURSOS_ASIG(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, nperfIdentificador);
            cs.registerOutParameter(2, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(2);
            while (rs.next()) {
                RecursoAsignado recurso = new RecursoAsignado();
                recurso.setNrecuIdentificador(rs.getInt("NRECU_IDENTIFICADOR"));
                recurso.setCmoduDescripcion(rs.getString("CMODU_DESCRIPCION"));
                recurso.setCrecuNombre(rs.getString("CRECU_NOMBRE"));
                lstRecursos.add(recurso);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstRecursos;
    }

    public static List<RecursoAsignado> obtenerRecursosDisponibles(int nperfIdentificador) throws SQLException {
        List<RecursoAsignado> lstRecursos = new ArrayList<RecursoAsignado>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_RECURSOS_DISP(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, nperfIdentificador);
            cs.registerOutParameter(2, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(2);
            while (rs.next()) {
                RecursoAsignado recurso = new RecursoAsignado();
                recurso.setNrecuIdentificador(rs.getInt("NRECU_IDENTIFICADOR"));
                recurso.setCmoduDescripcion(rs.getString("CMODU_DESCRIPCION"));
                recurso.setCrecuNombre(rs.getString("CRECU_NOMBRE"));
                lstRecursos.add(recurso);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstRecursos;

    }

    public static void ingresarRecursoAsignado(RecursoAsignado recurso) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_AGREGAR_RECURSO_ASIGNADO(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, recurso.getNperfIdentificador());
            cs.setInt(2, recurso.getNrecuIdentificador());
            cs.execute();
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static void eliminarRecursoAsignado(RecursoAsignado recurso) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_ELIMINAR_RECURSO_ASIGNADO(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, recurso.getNperfIdentificador());
            cs.setInt(2, recurso.getNrecuIdentificador());
            cs.execute();
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }
}
